"""
包含了所有与数据库 `tools` 表进行交互的 CRUD (创建, 读取, 更新, 删除) 操作函数。

这些函数将 Pydantic schema 作为输入，并返回 SQLAlchemy 模型实例。
"""
from sqlalchemy.orm import Session
from models import tool as models
from schemas import tool as tool_schemas
from uuid import UUID
from typing import List

def get_tool(db: Session, tool_id: UUID) -> models.Tool | None:
    """
    根据给定的 ID 从数据库中获取单个工具。

    Args:
        db: SQLAlchemy 数据库会话。
        tool_id: 要获取的工具的 UUID。

    Returns:
        如果找到，则返回对应的 Tool 模型实例；否则返回 None。
    """
    return db.query(models.Tool).filter(models.Tool.id == tool_id).first()

def get_tools(db: Session, skip: int = 0, limit: int = 100) -> List[models.Tool]:
    """
    从数据库中获取工具列表，支持分页。

    Args:
        db: SQLAlchemy 数据库会话。
        skip: 要跳过的记录数。
        limit: 要返回的最大记录数。

    Returns:
        一个包含 Tool 模型实例的列表。
    """
    return db.query(models.Tool).offset(skip).limit(limit).all()

def create_tool(db: Session, tool: tool_schemas.ToolCreate) -> models.Tool:
    """
    在数据库中创建一个新工具。

    Args:
        db: SQLAlchemy 数据库会话。
        tool: 包含新工具数据的 Pydantic schema。

    Returns:
        新创建的 Tool 模型实例。
    """
    tool_data = tool.model_dump()  # 使用新的model_dump方法
    # 确保mcp_tool_names字段有默认值
    if 'mcp_tool_names' not in tool_data or tool_data['mcp_tool_names'] is None:
        tool_data['mcp_tool_names'] = {}
    # target_api_url现在是字符串类型，不需要转换
    db_tool = models.Tool(**tool_data)
    db.add(db_tool)
    db.commit()
    db.refresh(db_tool)
    return db_tool

def update_tool(db: Session, tool_id: UUID, tool: tool_schemas.ToolUpdate) -> models.Tool | None:
    """
    根据给定的 ID 更新数据库中的一个现有工具。

    Args:
        db: SQLAlchemy 数据库会话。
        tool_id: 要更新的工具的 UUID。
        tool: 包含更新后工具数据的 Pydantic schema。

    Returns:
        如果找到并更新成功，则返回更新后的 Tool 模型实例；否则返回 None。
    """
    db_tool = db.query(models.Tool).filter(models.Tool.id == tool_id).first()
    if db_tool:
        update_data = tool.model_dump(exclude_unset=True)  # 使用新的model_dump方法
        # target_api_url现在是字符串类型，已经通过validator处理过，不需要额外转换

        for key, value in update_data.items():
            setattr(db_tool, key, value)
        db.commit()
        db.refresh(db_tool)
    return db_tool

def delete_tool(db: Session, tool_id: UUID) -> models.Tool | None:
    """
    根据给定的 ID 从数据库中删除一个工具。

    Args:
        db: SQLAlchemy 数据库会话。
        tool_id: 要删除的工具的 UUID。

    Returns:
        如果找到并删除成功，则返回被删除的 Tool 模型实例；否则返回 None。
    """
    db_tool = db.query(models.Tool).filter(models.Tool.id == tool_id).first()
    if db_tool:
        db.delete(db_tool)
        db.commit()
    return db_tool